package org.example.system.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWTUtil;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.Resource;
import org.example.system.config.properties.JwtProperties;
import org.example.system.security.constant.JwtClaimConstants;
import org.example.system.security.model.SysUserDetails;
import org.example.system.security.util.JwtUtils;
import org.example.system.service.JwtService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.*;
import java.util.stream.Collectors;

@Component
public class JwtServiceImpl  implements JwtService {


    @Resource
    private JwtProperties jwtProperties;

    /**
     * 生成安全密钥
     * @return
     */
    private Key getSecretKey() {
        return Keys.hmacShaKeyFor(jwtProperties.getSecret().getBytes(StandardCharsets.UTF_8));
    }

//    @Override
//    public String createJwt(String openid) {
//        return Jwts.builder()
//                .subject(openid)
//                .signWith(getSecretKey())
//                .issuedAt(new Date())
//                .compact();
//    }
@Override
public String createJwt(String openid) {
    // 获取当前时间
    Date now = new Date();
    // 设置过期时间
    Date expiration = DateUtil.offsetSecond(now, JwtUtils.ttl);

    // 创建 payload 数据
    Map<String, Object> payload = new HashMap<>();
    payload.put("sub", openid);                        // 主题 (sub)
    payload.put("iss", "荣达租车");                  // 签发人 (iss)
    payload.put("aud", "租车客户");                  // 受众 (aud)
    payload.put("iat", now);                          // 签发时间 (iat)
    payload.put("exp", expiration);                   // 过期时间 (exp)
    payload.put("jti", UUID.randomUUID().toString()); // JWT ID (jti)


    // 使用秘钥签名生成 JWT
    return JWTUtil.createToken(payload, JwtUtils.key); // 使用自定义的工具类生成 token
}


    @Override
    public Claims parseJwt(String token) {
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(getSecretKey())
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
            return claims;
        }
        catch (Exception e) {
            throw new RuntimeException("Jwt解析失败",e);
        }

    }

    @Value("${jwt.key}")
    public void setKey(String key) {
        JwtUtils.key = key.getBytes();
    }

    @Value("${jwt.ttl}")
    public void setTtl(Integer ttl) {
        JwtUtils.ttl = ttl;
    }




    /*
Payload 部分也是一个 JSON 对象，用来存放实际需要传递的数据。JWT 规定了7个官方字段，供使用。
        iss (issuer)：签发人
        exp (expiration time)：过期时间
        sub (subject)：主题
        aud (audience)：受众
        nbf (Not Before)：生效时间
        iat (Issued At)：签发时间
        jti (JWT ID)：编号
     */
   /* @Override
    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(jwtProperties.getSecret()).build()
                    .parseClaimsJws(token)
                    .getBody();
            return true;
        } catch (MalformedJwtException | UnsupportedJwtException | IllegalArgumentException | NullPointerException e) {
            return false;
        } catch (ExpiredJwtException e) {
            return false;
        }
    }*/
}
